home *** CD-ROM | disk | FTP | other *** search
/ BMUG PD-ROM 1995 Fall / PD-ROM F95.toast / Utilities / Text Utils / BBEdit Modules ƒ / Make Reply ƒ / For scriptors⁄programmers / Make Reply.p next >
Encoding:
Text File  |  1995-03-15  |  6.3 KB  |  296 lines  |  [TEXT/PJMM]

  1. unit Main;
  2.  
  3. { modified from BBIMPORT }
  4. { ANTI© 1993 Merzwaren }
  5.  
  6. interface
  7.  
  8.     uses
  9.         OSA, BBextIntf;
  10.  
  11.     procedure Main (callbacks: BBEditParmBlkPtr; w: WindowPtr);
  12.  
  13. implementation
  14.  
  15.     procedure Main (callbacks: BBEditParmBlkPtr; w: WindowPtr);
  16.         var
  17.             gSC: ComponentInstance;
  18.             sID: OSAID;
  19.             err: OSAError;
  20.             selStart, selEnd, firstChar: longint;
  21.             txt: Handle;
  22.             Sender, Subject: str255;
  23.  
  24.         procedure Debug (Str: str255);
  25.         begin
  26.             BBInsert(@Str[1], length(Str), callbacks^.insertProc);    { for debugging }
  27.         end;
  28.  
  29.         procedure DebugNum (Str: str255; N: longint);
  30.             var
  31.                 S: str255;
  32.         begin
  33.             NumToString(N, S);
  34.             Debug(concat(Str, ' *', S, '* '));
  35.         end;
  36.  
  37.         procedure CleanUp;
  38.         begin
  39.             if gSC <> nil then
  40.                 begin
  41.                     err := OSADispose(gSC, sID);
  42.                     err := CloseComponent(gSC);
  43.                 end;
  44.         end;  {CleanUp}
  45.  
  46.         procedure BeepAndExit;
  47.         begin
  48.             CleanUp;
  49.             SysBeep(2);
  50.             Exit(Main);
  51.         end;  {BeepAndExit}
  52.  
  53.         procedure CheckError;
  54.         begin
  55.             if (err <> noErr) then
  56.                 begin
  57. {DebugNum('Error', err);}
  58.                     BBReportOSError(err, callbacks^.reportOSErrProc);
  59.                     CleanUp;
  60.                     Exit(Main);
  61.                 end;
  62.         end;  {CheckError}
  63.  
  64.         procedure CheckNil (h: handle; n: integer);
  65.         begin
  66.             if (h = nil) then
  67.                 begin
  68.                     BBReportOSError(n, callbacks^.reportOSErrProc);
  69.                     CleanUp;
  70.                     Exit(Main);
  71.                 end;
  72.         end;  {CheckNil}
  73.  
  74.  
  75.         procedure GetMailFields;
  76.             var
  77.                 n: INTEGER;
  78.                 found: boolean;
  79.                 p1, p, v: longint;
  80.                 X, Y: str255;
  81.  
  82.             procedure SkipToCR;
  83.             begin
  84.                 p1 := p;
  85.                 while (p < v) & (ptr(p)^ <> 13) do
  86.                     p := p + 1;
  87.                 if (p < v) then
  88.                     p := p + 1;
  89.             end;
  90.  
  91.             procedure MakeString (start: longint; len: integer; var Str: str255);
  92.             begin
  93. {if len > 255 then len := 255;}
  94.                 BlockMove(ptr(start), @Str[1], len);
  95.                 Str[0] := chr(len);
  96.             end;
  97.  
  98.             procedure FilterQuotes (var Str: str255);
  99.                 var
  100.                     k: integer;
  101.             begin
  102.                 for k := 1 to length(Str) do
  103.                     if Str[k] = '"' then
  104.                         Str[k] := chr(39);    {'}
  105.             end;
  106.  
  107.         begin
  108.             p := ord(txt^) + selStart;
  109.             v := ord(txt^) + selEnd;
  110.             SkipToCR;
  111.             found := false;
  112.  
  113.             while (p1 < p) and not found do
  114.                 begin
  115.                     n := p - p1 - 1;
  116.                     if n > 255 then
  117.                         n := 255;
  118.                     MakeString(p1, 9, X);
  119.                     MakeString(p1, 6, Y);
  120.  
  121.                     case X[1] of
  122.                         'S': 
  123.                             if (Subject = '') & (X = 'Subject: ') then
  124.                                 begin
  125.                                     MakeString(p1 + 9, n - 9, Subject);
  126.                                     FilterQuotes(Subject);
  127.                                     if (Sender <> '') then
  128.                                         found := true;
  129.                                 end;
  130.                         'F': 
  131.                             if (Sender = '') & (Y = 'From: ') then
  132.                                 begin
  133.                                     MakeString(p1 + 6, n - 6, Sender);
  134.                                     FilterQuotes(Sender);
  135.                                     if (Subject <> '') then
  136.                                         found := true;
  137.                                 end;
  138.                     end;
  139.                     SkipToCR;
  140.                 end;
  141.             Subject := concat('Re: ', Subject);
  142.         end;
  143.  
  144.         procedure LoadScript (var ID: OSAID);
  145.             var
  146.                 h: handle;
  147.                 data: AEDesc;
  148.         begin
  149.             ID := kOSANullScript;
  150.             h := Get1Resource(kOSAScriptResourceType, 128);
  151.             err := ResError;
  152.             if (h <> nil) then
  153.                 begin
  154.                     data.descriptorType := typeOSAGenericStorage;
  155.                     data.dataHandle := h;
  156.                     err := OSALoad(gSC, data, kOSAModeNull, ID);
  157.                     ReleaseResource(data.dataHandle);
  158.                 end;
  159.             CheckError;
  160.         end;
  161.  
  162.         function SameContents (h1, h2: handle): boolean;
  163.             var
  164.                 n1, n2, k: longint;
  165.                 p1, p2: ptr;
  166.                 same: boolean;
  167.         begin
  168.             n1 := GetHandleSize(h1);
  169.             n2 := GetHandleSize(h2);
  170.             same := (n1 = n2);
  171.             p1 := h1^;
  172.             p2 := h2^;
  173.             k := 0;
  174.             while same & (k < n1) do
  175.                 begin
  176.                     if (p1^ <> p2^) then
  177.                         same := false;
  178.                     p1 := ptr(ord(p1) + 1);
  179.                     p2 := ptr(ord(p2) + 1);
  180.                     k := k + 1;
  181.                 end;
  182.             SameContents := same
  183.         end;
  184.  
  185.         procedure SaveScript (ID: OSAID);
  186.             var
  187.                 h: handle;
  188.                 R: AEDesc;
  189.         begin
  190.             h := Get1Resource(kOSAScriptResourceType, 128);
  191.             err := ResError;
  192.             CheckError;
  193.             if (h <> nil) then
  194.                 begin
  195.                     err := OSAStore(gSC, ID, typeOSAGenericStorage, kOSAModeNull, R);
  196.                     CheckError;
  197.                     if SameContents(h, R.dataHandle) then
  198.                         begin
  199.                             ReleaseResource(h);
  200.                             DisposHandle(R.dataHandle);
  201.                         end
  202.                     else
  203.                         begin
  204.                             RmveResource(h);
  205.                             DisposHandle(h);
  206.                             AddResource(R.dataHandle, kOSAScriptResourceType, 128, '');
  207.                             WriteResource(R.dataHandle);
  208.                             ReleaseResource(R.dataHandle);
  209.                         end;
  210.                 end;
  211.         end;
  212.  
  213.         procedure StringToHandle (Str: str255; h: handle);
  214.         begin
  215.             SetHandleSize(h, length(Str));
  216.             if GetHandleSize(h) = length(Str) then
  217.                 BlockMove(@Str[1], h^, length(Str));
  218.         end;
  219.  
  220.         procedure RunScript (ID: OSAID);
  221.             const
  222.                 kASAppleScriptSuite = 'ascr';
  223.                 kASSubroutineEvent = 'psbr';
  224.                 keyASSubroutineName = 'snam';
  225.             var
  226.                 res, D: AEDesc;
  227.                 List: AEDescList;
  228.                 AE: AppleEvent;
  229.                 rID: OSAID;
  230.         begin
  231. { Create the event to send to the script }
  232.             err := AECreateDesc(typeNull, nil, 0, D);
  233.             err := AECreateAppleEvent(kASAppleScriptSuite, kASSubroutineEvent, D, kAutoGenerateReturnID, kAnyTransactionID, AE);
  234.             CheckError;
  235.  
  236. { Insert the subroutine event name }
  237.             D.descriptorType := typeChar;
  238.             D.dataHandle := BBAllocate(0, false, callbacks^.AllocateProc);
  239.             StringToHandle('mail', D.dataHandle);
  240.             err := AEPutParamDesc(AE, keyASSubroutineName, D);
  241.             CheckError;
  242.  
  243. { Make a list of positional parameters into the Direct Object }
  244.             err := AECreateList(nil, 0, false, List);
  245.             StringToHandle(Sender, D.dataHandle);
  246.             err := AEPutDesc(List, 1, D);
  247.             CheckError;
  248.             StringToHandle(Subject, D.dataHandle);
  249.             err := AEPutDesc(List, 2, D);
  250.             CheckError;
  251.             err := AEPutParamDesc(AE, keyDirectObject, List);
  252.             CheckError;
  253.  
  254. { Send the event to the script }
  255.             err := OSAExecuteEvent(gSC, AE, ID, kOSAModeNull, rID);
  256.             CheckError;
  257.             err := AEDisposeDesc(AE);
  258.             err := AEDisposeDesc(List);
  259.             err := AEDisposeDesc(D);
  260.             err := OSADispose(gSC, rID);
  261.         end;
  262.  
  263.     begin
  264.         if (w <> nil) & (WindowPeek(w)^.windowKind = userKind) then
  265.             begin
  266. {SetCursor(GetCursor(watchCursor)^^);}
  267.                 gSC := nil;
  268.  
  269.                 txt := BBGetWindowContents(w, callbacks^.getWindowContentsProc);
  270.                 BBGetSelection(selStart, selEnd, firstChar, callbacks^.GetSelectionProc);
  271.                 if (selEnd = selStart) then
  272.                     begin
  273.                         selStart := 0;
  274.                         selEnd := GetHandleSize(txt);
  275.                     end;
  276.  
  277.                 Subject := '';
  278.                 Sender := '';
  279.                 GetMailFields;
  280.                 if Sender = '' then
  281.                     BeepAndExit;
  282.  
  283.                 gSC := OpenDefaultComponent(kOSAComponentType, kOSAGenericScriptingComponentSubtype);
  284.                 if gSC = nil then
  285.                     BeepAndExit;
  286.  
  287.                 LoadScript(sID);
  288.                 SaveScript(sID);
  289.                 RunScript(sID);
  290.  
  291.                 CleanUp;
  292. {InitCursor;}
  293.             end;
  294.     end;
  295.  
  296. end.